昨天完整的講完了 TextMessage 之後,今天要來接著講同屬於 Message Event 底下不同類別的 ImageMessage, VideoMessage 跟 AudioMessage 了。
雖然都同屬於 Message Event ,但今天要介紹的三個類別跟前面介紹的 TextMessage 處理方式相當不同,而且使用頻率不算低,因此需要著重介紹一下。
首先是 ImageMessage ,我們還是一樣先幫 handler 加入一個處理函式。
@handler.add(MessageEvent, message=(ImageMessage))
def handle_media(event):
pass
接著我們可以參考官方的介紹
webhook 會傳來的一些事件 (Event) 及其格式 - Webhook event object
從官方文件我們可以得知,傳入的消息並不會包含圖片本身,需要我們先取得 Message ID 之後,再經由另一隻 API 去下載圖片。
因此,我們可以改成如下。
@handler.add(MessageEvent, message=(ImageMessage))
def handle_media(event):
content = line_bot_api.get_message_content(event.message.id)
os.makedirs("Media", exist_ok=True)
with open(F"Media/{event.message.id}.{content.content_type.split('/')[1].lower()}", "wb") as fp:
for iter_data in content.iter_content():
fp.write(iter_data)
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=event.message.id)
)
LineBotApi 有內建一個好用的方法 get_message_content
,可以直接幫我們取得檔案內容,所以我們只需要把取得的內容存下來就 OK 了,這邊因為 Line 可以接收 jpeg
or png
兩種格式,因此我們需要取得 Content-Type 判斷是哪種格式在儲存。
接著我們就可以來試試 VideoMessage 跟 AudioMessage ,影片的部分 Line 只支援 mp4
格式,聲音只支援 aac
格式,因此我們可以將上面的程式改成這樣。
@handler.add(MessageEvent, message=(ImageMessage, VideoMessage, AudioMessage, FileMessage))
def handle_media(event):
content = line_bot_api.get_message_content(event.message.id)
os.makedirs(f"Media/{event.message.type.title()}", exist_ok=True)
with open(F"Media/{event.message.type.title()}/{event.message.id}.{content.content_type.split('/')[1].lower()}", "wb") as fp:
for iter_data in content.iter_content():
fp.write(iter_data)
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=event.message.id)
)
這樣就可以成功將圖片、影像與聲音的檔案接儲存下來了。
那麼就先到這邊, Line 中最常使用的幾種 Message 我們都可以進行處裡了,但各位有沒有發現還少一種也很常見的 Message 沒處理到呢?
大家掰~掰~